package com.xique.park.utils;

import com.xique.common.core.utils.StringUtils;
import com.xique.park.bean.vo.xj.ParkXjReductionVo;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.collections4.map.HashedMap;

import java.util.Arrays;
import java.util.Map;

public class XjSignUtils {

    public static boolean signVerification(ParkXjReductionVo parkXjReductionvo, String key, String sign) {
        // 先将获取的三个参数放入一个map集合，只对三个参数进行签名加密是为了兼容以前的协议。
        Map<String, Object> paramMap = new HashedMap<>();
        paramMap.put("plateNo", parkXjReductionvo.getPlateNo());
        paramMap.put("merchId", parkXjReductionvo.getMerchId());
        paramMap.put("duration", parkXjReductionvo.getDuration());
        // 调用genSign方法，将组装好的map集合和签名秘钥作为参数传入
        String str = genSign(paramMap, key);
        System.out.println("************  " + str);
        if (str.equals(sign)) {
            return true;
        }
        return false;
    }

    public static String genSign(final Map<String, Object> paramMap, String signKey) {
        // 创建一个长度和map.size()大小一致的字符串数组
        String[] keyArray = new String[paramMap.keySet().size()];
        // 将map的key的set集合转化为数组
        paramMap.keySet().toArray(keyArray);
        // 将数组元素按字典序进行排序
        Arrays.sort(keyArray);
        StringBuffer sb = new StringBuffer();
        // 遍历key数组
        for (String key : keyArray) {
            // 将键与值按照key=value&进行拼接
            if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(paramMap.get(key).toString())) {
                sb.append(key).append("=").append(paramMap.get(key)).append("&");
            }
        }
        // 拼接秘钥时先将秘钥做一次md5加密然后拼接
        sb.append("key=").append(DigestUtils.md5Hex(signKey));
        // 将拼接的字符串先进行md5加密，再转为大写
        String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase();
        return sign;
    }

    /**
     * 参数合法性验证
     *
     * @param parkXjReductionVo
     * @return
     * @throws Exception
     */
    public static boolean verifyReq(ParkXjReductionVo parkXjReductionVo) {
        if (parkXjReductionVo.getPlateNo() == null || "".equals(parkXjReductionVo.getPlateNo())) {
            return false;
        }
        if (parkXjReductionVo.getMerchId() == null || "".equals(parkXjReductionVo.getMerchId())) {
            return false;
        }
        if (parkXjReductionVo.getDuration() == null || "".equals(parkXjReductionVo.getDuration())) {
            return false;
        }
        if (parkXjReductionVo.getBizld() == null || "".equals(parkXjReductionVo.getBizld())) {
            return false;
        }
        if (parkXjReductionVo.getStartChargingTime() == null || "".equals(parkXjReductionVo.getStartChargingTime())) {
            return false;
        }
        if (parkXjReductionVo.getStopChargingTime() == null || "".equals(parkXjReductionVo.getStopChargingTime())) {
            return false;
        }
        if (parkXjReductionVo.getSign() == null || "".equals(parkXjReductionVo.getSign())) {
            return false;
        }
        return true;
    }

}
